Unity 3D 基础概念

基础概念

  1. GameObjects:

    游戏对象,即游戏中的最基本单位,游戏中的每一个对象都是游戏对象。它相当于一个容器,本身并无太多属性,需添加各种组件,资源后才能达到设计者的所希望的游戏行为目的。

    Assets:

    指可应用于Unity上的各种资源,为游戏添加各种属性,从而实现目标效果;同时,一个Unity Project的Assets文件夹指存储于本地计算机中的各种图片,预制,script等文件的总和。一个Assets中可以包含多个GameObjectGameObject从逻辑上讲存储于Assets文件夹中。

  2. 游戏结构目录:

    Assets

    • Scene 保存游戏场景
    • Game 保存美术资源
      • Materials 保存材质球,用于调整颜色等
      • Prefabs 保存预制,即游戏对象的模板,方便克隆
      • Model _模型_
      • Animations 保存动画文件
      • Audio 音频文件
      • Textures 贴图文件
      • UI UI文件
      • Scripts 脚本文件
    • Plugins _插件_
      • Editor 保存编辑器类文件
  3. MonoBehaviour 基本行为触发条件:

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    // Use this for initialization
    void Start () {
    Debug.Log("init Start");
    }
    // Update is called once per frame
    void Update () {
    Debug.Log("init Update");
    }
    void Awake()
    {
    Debug.Log("init Awake");
    }
    void FixedUpdate()
    {
    Debug.Log("init FixedUpdate");
    }
    void LateUpdate()
    {
    Debug.Log("init LateUpdate");
    }
    void OnGUI()
    {
    Debug.Log("init OnGUI");
    }
    void OnDisable()
    {
    Debug.Log("init OnDisable");
    }
    void OnEnable()
    {
    Debug.Log("init OnEnable");
    }

    Start:

    start

    Per frame:

    per frame

    End:

    end

    结论:

    • Awake(): 当脚本实例被载入时调用;
    • Start(): 在Update()前被调用一次;
    • Update(): 行为启用时,每一帧被调用一次;
    • FixedUpdate(): 行为启用时,每一时间片被调用;
    • LateUpdate(): 行为启用时,Update()之后被调用;
    • OnGUI(): 每帧调用多次,响应GUI事件;
    • OnEnable(): 当对象变为启用并激活时,调用该函数;
    • OnDisable(): 当对象变为禁用或不活动时,调用该函数。
  4. 简单介绍GameObject, Transform 和 Component,并画出三者的UML图。
    • GameObject: Unity 场景中所有实体的基类。
    • Transform: 一个对象的位置,旋转和大小。
    • Component: 所有附加到游戏对象的属性的基类。
  • UML

    UML

  1. 简单代码

    • 查找对象

      新建项目,其中有 Sphere 游戏对象,代码如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      void Start()
      {
      Debug.Log("init start");
      }

      void FixedUpdate()
      {
      var x = GameObject.Find("Sphere");
      if (x.name != null)
      {
      Debug.Log("find the gameobject");
      }
      else
      {
      Debug.Log("Not found");
      }
      }
    • 添加子对象

      代码如下:

      1
      2
      3
      4
      5
      6
      7
      void Start()
      {
      GameObject sph = GameObject.Find("Sphere");
      GameObject child = GameObject.CreatePrimitive(PrimitiveType.Cube);
      child.transform.parent = sph.transform;
      Debug.Log("Success");
      }
    • 遍历对象树

      代码如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      GameObject obj = GameObject.Find("Sphere");
      print("父对象名称为:" + obj.name + " 有" + obj.transform.childCount + "个子对象");
      int i = 0;
      while (i < obj.transform.childCount)
      {
      Transform child = obj.transform.GetChild(i);
      print("这是第: " + i + " 个子对象, 名称为: " + child.name);
      i++;
      }
    • 清除所有子对象

      代码如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      GameObject obj = GameObject.Find("Sphere");
      print("父对象名称为:" + obj.name + " 有" + obj.transform.childCount + "个子对象");
      int i = 0;
      while (i < obj.transform.childCount)
      {
      Transform child = obj.transform.GetChild(i);
      print("这是第: " + i+1 + " 个子对象, 名称为: " + child.name);
      GameObject pchild = GameObject.Find(child.name);
      GameObject.Destroy(pchild);
      i++;
      }
  2. 预设与对象克隆

    • Prefabs:

    • 预制可以存储一个带有组件和属性的 GameObject 作为模板,当想创建新的实例时,可以直接拖动模板进行创建。对预制做的修改可以应用到由该模板生成的所有实例中,也可以单独编辑每一个实例。

    • 总的来说,预设和对象克隆都能生成新的对象实例,但相比较而言,由 clone 生成的实例,编辑原对象时,就不能应用到所有实例中。

    • 预制 table :

      1
      2
      3
      4
      5
      public GameObject prefab;
      void Start()
      {
      Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity);
      }
  3. 组合模式

    • 组合模式:

      定义:组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对组合对象和单个对象的使用具有一致性。

      包含三个部分:抽象构件,叶子构件和容器构件。

      目的即是使得对根节点的调用方法对叶子节点同样适用,使得工作效率更高。

    • 代码:

      ​ 有三种发送消息的函数,其中BroadcastMessage()由父类发送给子类,括号里面:第一个参数为回应的函数,第二个参数为传递给回应函数的参数。

      1
      2
      3
      4
      5
      6
      7
      void Start () {
      gameObject.BroadcastMessage("MySon","I am your father");
      }
      void MySon(string ss)
      {
      Debug.Log("I am your son");
      }
分享到 评论